perm filename WALDRV.SAI[SYS,HE] blob
sn#054277 filedate 1973-07-30 generic text, type T, neo UTF8
00100
00200
00300
00400 BEGIN "WALDRV"
00500
00600 COMMENT This is the driver program for WALEYE;
00700
00800
00900 REQUIRE "{ } { }" DELIMITERS;
01000
01100 DEFINE INTEGER_ARRAY="INTEGER ARRAY";
01200 DEFINE BUF_LIMIT="200";
01300 SHORT REAL SCAL;
01400
01500 REQUIRE "PREAMB.SAI[SYS,HE]" SOURCE_FILE;
01600 REQUIRE "HELIB[1,3]" LIBRARY;
01700 REQUIRE "SAITRG[SYS,BGB]" SOURCE_FILE;
01800 REQUIRE "DPY2.HDR[VIS,WAP]" SOURCE_FILE;
01900
02000
02100 EXTERNAL PROCEDURE TVIN;
02200
02300 EXTERNAL INTEGER FLINE,LLINE,LSIDE,RSIDE,TVCAM,TCLIP,BCLIP;
02400 EXTERNAL INTEGER TVWORD;
02500 EXTERNAL INTEGER PROCEDURE GIOWD(INTEGER ARRAY BUF);
02600
02700
02800
02900 DEFINE ⊃ = {COMMENT}, CRLF={'15&'12}, ACRLF={&'15&'12};
03000 DEFINE SINDIR={12}, COSDIR={13}, SINTHETA={9}, COSTHETA={10};
03100 DEFINE PI1={3.1415927}, PIO2={1.570796}, PI6={.523595};
03200 DEFINE PRINT(FOO) = {OUTSTR(" FOO="&CVG(FOO)ACRLF); };
03300
03400
03500
03600
03700 PROCEDURE CORNFIT;
03800 BEGIN "CORNFIT"
03900 SHORT INTEGER X_WIDTH, Y_WIDTH;
04000
04100
04200
04300 SIMPLE PROCEDURE BOUNDARY(SHORT REAL X1,Y1,X2,Y2);
04400 BEGIN
04500 X1 ← TX(X1);
04600 Y1 ← TY(Y1);
04700 X2 ← TX(X2);
04800 Y2 ← TY(Y2);
04900 AIVECT(X1,Y1);
05000 AVECT(X1,Y2);
05100 AVECT(X2,Y2);
05200 AVECT(X2,Y1);
05300 AVECT(X1,Y1);
05400 END;
05500
05600
05700 SIMPLE PROCEDURE ARROW(REAL X,Y,DX,DY);
05800 BEGIN
05900 REAL FACTOR,X1,X2,Y1,Y2;
06000 FACTOR←1.5;
06100 DX←DX*FACTOR;
06200 DY←DY*FACTOR;
06300 X1 ← TX(X-DX);
06400 X2 ← TX(X+DX);
06500 Y2 ← TY(Y+DY);
06600 Y1 ← TY(Y-DY);
06700 AIVECT(X1,Y1);
06800 AVECT(X2,Y2);
06900 X1← TX(X+DX/2.-DY/2.);
07000 Y1← TY(Y+DY/2.+DX/2.);
07100 AIVECT(X1,Y1);
07200 AVECT(X2,Y2);
07300 Y1← TY(Y+DY/2.-DX/2.);
07400 X1← TX(X+DX/2.+DY/2.);
07500 AVECT(X1,Y1);
07600 END;
07700
07800
07900
08000 SIMPLE PROCEDURE LINE_MOD(SHORT REAL CX,CY; REFERENCE SHORT REAL
08100 THETA,COSTH,SINTH);
08200 ⊃ This procedure takes the direction cosines CX, CY and
08300 calculates the appropriate angle theta;
08400
08500 BEGIN
08600 SHORT REAL PHI;
08700 IF ABS(CX) ≥.10@-8 THEN
08800 BEGIN
08900 PHI ← ATAN(CY/CX);
09000 IF CX<0 THEN PHI←PHI+PI1;
09100 END ELSE
09200 IF CY≥0 THEN PHI ← PIO2 ELSE PHI ← -PIO2;
09300 THETA ← PHI +PI1;
09400 COSTH←COS(THETA);
09500 SINTH←SIN(THETA);
09600 IF DEB_EYE THEN OUTSTR(CRLF&"PHI = " &CVG(PHI)
09700 &"THETA = " &CVG(THETA)
09800 &" SINTH="&CVG(SINTH)
09900 &" COSTH="&CVG(COSTH)&CRLF);
10000 END;
10100
00100
00200
00300 PROCEDURE DISP_MODEL(SHORT INTEGER N,DIREC; SHORT REAL XCM,YCM;
00400 SHORT REAL ARRAY CORNMOD);
00500
00600 ⊃ Here we calculate and display the model of a line or corner;
00700
00800 BEGIN "MOD"
00900
01000
01100 SIMPLE REAL PROCEDURE SMALLER(REAL L1,L2);
01200 IF L1<L2 THEN RETURN(L1) ELSE RETURN(L2);
01300
01400 SHORT REAL XC,YC, DX,DY,DPX,DPY,TXC,TYC,
01500 DX3,DY3, L,LO2;
01600 LABEL AFTER;
01700 ⊃ DISPLAY MODEL OF LINE OR CORNER;
01800 ⊃ OUTSTR(" DIREC="&CVS(DIREC)ACRLF);
01900 L←SMALLER(15.,SQRT(X_WIDTH*Y_WIDTH)/2.);
02000 LO2←L/2.;
02100 DPX←CORNMOD[1,COSTHETA]; DPY←CORNMOD[1,SINTHETA];
02200 DY←CORNMOD[1,COSDIR]; DX←CORNMOD[1,SINDIR];
02300 XC←XCM-LO2*DX; YC←YCM-LO2*DY;
02400 IF N=1 THEN
02500 BEGIN
02600 AIVECT(TX(XC),TY(YC));
02700 AVECT(TX(XCM+LO2*DX),TY(YCM+LO2*DY));
02800 XC←XCM; YC←YCM;
02900 END ELSE
03000 BEGIN
03100 TXC←TX(XCM); TYC←TY(YCM);
03200 AIVECT(TX(XCM-L*DX),TY(YCM-L*DY));
03300 AVECT(TXC,TYC);
03400 END;
03500 ARROW(XC,YC,DPX,DPY);
03600 IF DIREC=0 THEN ARROW(XC,YC,-DPX,-DPY);
03700 IF N=1 THEN GO TO AFTER;
03800 ⊃ IF ABS(DPY)>0.5 THEN ARROW(XC,YC-3,DX,DY)
03900 ELSE ARROW(XC-3,YC,DX,DY);
04000 IF N=2 THEN
04100 BEGIN
04200 AIVECT(TXC,TYC);
04300 DX←CORNMOD[2,SINDIR]; DY←CORNMOD[2,COSDIR];
04400 DPX←CORNMOD[2,COSTHETA];
04500 DPY←CORNMOD[2,SINTHETA];
04600 XC←XCM-LO2*DX; YC←YCM-LO2*DY;
04700 AVECT(TX(XCM-L*DX),TY(YCM-L*DY));
04800 ARROW(XC,YC,DPX,DPY);
04900 IF DIREC=0 THEN ARROW(XC,YC,-DPX,-DPY);
05000 ⊃ IF ABS(DPY)>0.5 THEN
05100 ARROW(XC,YC-3,DX,DY)
05200 ELSE ARROW(XC-3,YC,DX,DY);
05300 GO TO AFTER;
05400 END;
05500 DX←CORNMOD[2,SINDIR]; DY←CORNMOD[2,COSDIR];
05600 AIVECT(TX(XCM-L*DX),TY(YCM-L*DY));
05700 AVECT(TXC,TYC);
05800 DX3←CORNMOD[3,SINDIR]; DY3←CORNMOD[3,COSDIR];
05900 AVECT(TX(XCM-L*DX3),TY(YCM-L*DY3));
06000 DPX←CORNMOD[2,COSTHETA]; DPY←CORNMOD[2,SINTHETA];
06100 XC←XCM-LO2*DX; YC←YCM-LO2*DY;
06200 ⊃ IF ABS(DPY)>0.5 THEN ARROW(XC,YC-3,DX,DY)
06300 ELSE ARROW(XC-3,YC,DX,DY);
06400 DPX←CORNMOD[3,COSTHETA]; DPY←CORNMOD[3,SINTHETA];
06500 XC←XCM-LO2*DX3; YC←YCM-LO2*DY3;
06600 ARROW(XC,YC,DPX,DPY);
06700 IF DIREC=0 THEN ARROW(XC,YC,-DPX,-DPY);
06800 ⊃ IF ABS(DPY)>0.5 THEN ARROW(XC,YC-3,DX3,DY3)
06900 ELSE ARROW(XC-3,YC,DX3,DY3);
07000 AFTER: DPYBIG(3);
07100 AIVECT(-300,420);
07200 DPYSST("MODEL OF CORNER");
07300 AIVECT(-500,380);
07400 DPYSST("ARROWS(PERPENDICULAR TO LINES) POINT FROM LIGHT TO DARK");
07500 DPYOUT(1);
07600 END "MOD";
07700
00100
00200
00300 DEFINE XTIME(FOO)={XCEN+10.*SIN(PI6*(FOO))};
00400 DEFINE YTIME(FOO)={YCEN-10.*COS(PI6*(FOO))};
00500 SHORT INTEGER I, BKGR, DIREC, SIGD, SEARCH,J,MODLINES;
00600 SHORT INTEGER DUMMY,MESS,CAMNUM,SIZE,NCORNERS;
00700 INTEGER TIME;
00800 SHORT REAL XIB,YIB,XIC,YIC,XID,YID,XIE,YIE,XIBB,YIBB;
00900 SHORT REAL XCEN,YCEN,X1,Y1,X2,Y2;
01000 SHORT REAL TOLER,CX,CY,CX1,CY1,XX1,YY1,XX2,YY2,TIME1,TIME2,TIME3;
01100 STRING INSTRING,TYPE_CORN;
01200 SHORT REAL ARRAY CORNMOD[1:3,8:13];
01300 LABEL LOP,LOOP,LOOP1,LOOP2,PAR,PARMS,SETSIG,WIN;
01400 COMMENT LABELS MUST BE DECLARED BEFORE USE -- IN FACT, THEY HAVE
01500 TO BE DECLARED WITHIN THE INNER-MOST BLOCK IN WHICH THE
01600 STATEMENT BEING LABELED APPEARS. (SEE SAIL 3.4);
01700
01800
01900
02000 SIMPLE INTEGER PROCEDURE LARGER(SHORT INTEGER L1,L2);
02100 IF L1>L2 THEN RETURN(L1) ELSE RETURN(L2);
02200
02300
02400 ⊃ Main Program;
02500 X_WIDTH←40; Y_WIDTH←30;
02600 PUT_DATA(0,0,"DRV");
02700 COMMENT THIS INFORMS THE MESSAGE PROCEDURE HANDLER THAT YOUR
02800 LOGICAL NAME (IE. YOUR ADDRESS FOR MESSAGES) IS "DRV"
02900 (SEE HAND/EYE HACKERS PART II 2.2);
03000
03100 OUTSTR("TRYEYE WAITING"ACRLF);
03200 COMMENT THIS PRINTS A NOTE SAYING THAT YOU'VE GOTTON THIS FAR;
03300 WHILE (¬YES_CAM)∨(¬YES_EYE) DO CALL(1,"SLEEP");
03400 COMMENT YES_CAM IS A GLOBAL VARIABLE WHICH IS SET TO TRUE AS
03500 SOON AS THE CAMERA PROGRAM IS RUNNING AND READY TO ACCEPT
03600 MESSAGES. YES_EYE IS SIMILAR EXCEPT IT IS SET BY GILEYE.
03700 `CALL(1,"SLEEP")' IS A CALL USING A CONSTRUCTION IN SAIL
03800 WHICH ALLOWS A SAIL PROGRAM TO CALL PDP SYSTEM ROUTINES.
03900 THIS ONE EFFECTIVELY TAKES THIS JOB OUT OF THE RUNQ
04000 FOR A SHORT AMOUNT OF TIME (SEE SAIL 12-118,12-119).
04100 CONSEQUENTLY, THIS STATEMENT HAS THE PROGRAM WAIT (WITHOUT
04200 TYING UP THE RUNQ) UNTIL BOTH THE CAMERA AND GILEYE JOBS
04300 ARE READY.;
04400 OUTSTR("TRYEYE READY"ACRLF);
04500 COMMENT THIS SIMPLY OUTPUTS A NOTE SAYING THAT EVERYTHING IS READY;
04600 TRACING ← 1;
04700 COMMENT THIS TURNS ON THE TRACING OF MESSAGES, ETC.;
04800
04900 LOP: OUTSTR(" WHICH CAMERA ARE YOU GOING TO USE?
05000 1 FOR COHU --- 2 FOR SIERRA "ACRLF);
05100 CAMNUM←CVD(INCHWL);
05200 OUTSTR("CAMERA NUMBER="& CVS(CAMNUM)ACRLF);
05300 IF CAMNUM≠1∧CAMNUM≠2 THEN GO TO LOP;
05400 LOOK_AT[1]←CAMNUM;
05500
05600
05700 ⊃ MESS ← ISSUE(7,"DRV","CAM",MESSAGE CAM_UPDATE(CAMNUM));
05800 COMMENT THIS ASKS THE CAMERA JOB TO RUN ITS ROUTINE
05900 CAM_UPDATE (SEE PREAMB.TXT SECT 3). CAM_UPDATE READS
06000 THE POTS ON THE CAMERA AND INITIALIZES THE GLOBAL ARRAY
06100 CAMERA_MODEL (SEE PREAMB.TXT UNDER MODELS, ALSO SEE
06200 HAND/EYE UTILITY ROUTINES UNDER CAMCHG) TO INDICATE
06300 THE CURRENT POSITION. THIS ROUTINE MUST (YES, MUST)
06400 BE EXECUTED BEFORE ASKING THE CAMERA TO MOVE (AS IN
06500 THE NEXT STATEMENT). THE 7 IN THE ISSUE COMMAND IS A CODE
06600 INDICATING THAT THE MESSAGE SHOULD BE HANDLED "NORMALLY".
06700 THIS MEANS THAT THE "DRV" PROGRAM WILL WAIT UNTIL THE
06800 "CAM" PROGRAM INDICATES THAT IT HAS FINISHED. IT
06900 ALSO MEANS THE MESSAGE WILL BE DESTROYED AFTER IT HAS
07000 BEEN ACTED UPON AND ACKNOWLEDGED (SEE HAND/EYE HACKERS
07100 PART II 4.0)
07200
07300 ISSUE ACTS LIKE A FUNCTION IN THAT IT RETURNS A VALUE
07400 (THE INTERNAL NUMBER FOR THE MESSAGE). SOMETIMES THIS
07500 NUMBER CAN BE USED TO OBTAIN MORE INFORMATION ABOUT THE
07600 MESSAGE (SEE HAND/EYE HACKERS PART II). HOWEVER, IN THIS
07700 SIMPLE EXAMPLE, IT IS NEVER USED. HENCE, THE VARIABLE,
07800 MESS, IS A DUMMY RECEIVING FIELD.;
07900
08000 LOOP: OUTSTR("TYPE A <CR>
08100 WHEN YOU ARE SATISFIED WITH THE CAMERA POSITION"ACRLF);
08200 INCHWL;
08300 COMMENT THIS STATEMENT CAUSES THE PROGRAM TO PAUSE FOR A
08400 RESPONSE FROM THE CONSOLE. THIS PAUSE ALLOWS YOU TIME TO AIM
08500 AND FOCUS THE CAMERA YOURSELF IF YOU WANT TO (SEE THE BRIEF
08600 DISCUSSION ON OPERATING THE CAMERA UNDER "INSTRUCTIONS TO
08700 RUN THIS PROGRAM" INSTRUCTION NUMBER III). WHEN YOU ARE
08800 FINISHED, TYPE ANYTHING (EVEN NOTHING) FOLLOWED BY A
08900 CARRIAGE-RETURN).;
09000
09100 ⊃ MESS ← ISSUE(7,"DRV","CAM",MESSAGE CAM_UPDATE(CAMNUM));
09200 COMMENT THIS UPDATES THE GLOBAL CAMERA_MODEL IN CASE YOU
09300 CHANGED THE CAMERA POSITION. THE CAMERA_MODEL ARRAY IS
09400 NOT AUTOMATICALLY UPDATED IF YOU MOVE THE CAMERA AROUND
09500 MANUALLY.;
09600
09700 DIS_EYE←TRUE; DEB_EYE←FALSE;
09800 ⊃ OUTSTR(" ARE YOU DEBUGGING AND WANT ALL POSSIBLE OUTPUT?
09900 Y OR N? "ACRLF);
10000 ⊃ IF INCHWL="Y" THEN DEB_EYE←TRUE;
10100
10200 ⊃ OUTSTR("DO YOU WANT CALCOMP PLOTS? Y OR N?"ACRLF);
10300 ⊃ IF INCHWL="Y" THEN EYEFLG←-1 ELSE EYEFLG←0;
10400 EYEFLG←0;
10500
10600
10700 WIN: OUTSTR(" THE STANDARD OR PRESENT WINDOW SIZE IS:
10800 WIDTH="&CVS(X_WIDTH)&" HEIGHT="&CVS(Y_WIDTH)&
10900 " DO YOU WANT TO CHANGE IT? Y OR N? "ACRLF);
11000 IF INCHWL="Y" THEN
11100 BEGIN
11200 OUTSTR(" WIDTH AND HEIGHT
11300 EACH FOLLOWED BY A CARRIAGE-RETURN "ACRLF);
11400 X_WIDTH←CVD(INCHWL);
11500 Y_WIDTH←CVD(INCHWL);
11600 GO TO WIN;
11700 END;
11800
11900
12000 LOOP1: OUTSTR(" ARE YOU LOOKING FOR A LINE,SIMPLE CORNER(2 SIDES),
12100 OR PHYSICAL CORNER(3 SIDES)? [TYPE L,C, OR P] "ACRLF);
12200
12300 MODLINES←0;
12400 TYPE_CORN←INCHWL;
12500 IF TYPE_CORN="L" THEN
12600 BEGIN
12700 MODLINES←1;
12800 OUTSTR(" ONE LINE WITH 3 NUMBERS, THE FIRST TWO
12900 DESIGNATE THE CENTER OF THE LINE IN SCREEN COORDINATES,
13000 THE THIRD IS THE VALUE OF THE HOUR HAND WHEN IT IS PARALLEL TO THE
13100 LINE WHILE THE FORTH IS ANY HOUR-HAND SETTING ON THE SIDE OF THE
13200 OBJECT."ACRLF);
13300 END;
13400 IF TYPE_CORN="C" THEN
13500 BEGIN
13600 MODLINES←2;
13700 OUTSTR(" ONE LINE WITH 4 NUMBERS THE FIRST TWO
13800 DESIGNATES THE VERTEX IN SCREEN COORDINATES WHILE THE OTHERS GIVE
13900 THE ANGLES OF THE LINES IN HOUR-HAND VALUES IN A CLOCKWISE MANNER
14000 ABOUT THE VERTEX."ACRLF);
14100 END;
14200 IF TYPE_CORN="P" THEN
14300 BEGIN
14400 MODLINES←3;
14500 OUTSTR(" ONE LINE WITH 5 NUMBERS THE FIRST TWO
14600 DESIGNATES THE VERTEX IN SCREEN COORDINATES WHILE THE OTHERS GIVE
14700 THE ANGLES OF THE LINES IN HOUR-HAND VALUES IN A CLOCKWISE MANNER
14800 ABOUT THE VERTEX."ACRLF);
14900 END;
15000 IF MODLINES=0 THEN GO TO LOOP1;
15100
15200
15300 INSTRING ← INCHWL;
15400 XIB ← REALSCAN(INSTRING,DUMMY);
15500 YIB ← REALSCAN(INSTRING,DUMMY);
15600 TIME1 ← REALSCAN(INSTRING,DUMMY);
15700 TIME2 ← REALSCAN(INSTRING,DUMMY);
15800 TIME3 ← REALSCAN(INSTRING,DUMMY);
15900
16000
16100 PARMS:
16200
16300 OUTSTR(" ONE LINE WITH 3 WAL PARAMETERS.
16400 FIRST IS INTENSITY:
16500 -1 FOR DARKER OUTSIDE
16600 0 FOR UNKNOWN
16700 1 FOR LIGHTER OUTSIDE
16800 SECOND IS SEARCH:
16900 -1 FOR USE WINDOW ONLY
17000 N≥1 FOR SEARCH IN AN AREA OF DIMENSION
17100 N(INTEGER) ABOUT INITIAL WINDOW
17200 THIRD IS TOLERANCE OF ANGLE MATCH:
17300 USUALLY 0.1 BUT DOWN TO 0.02 WITH CARE.
17400 IF TOLERANCE IS >1 THEN ANY CORNER
17500 WILL BE ACCEPTED."ACRLF);
17600
17700
17800 INSTRING←INCHWL;
17900 DIREC←REALSCAN(INSTRING,DUMMY);
18000 SEARCH←REALSCAN(INSTRING,DUMMY);
18100 TOLER←REALSCAN(INSTRING,DUMMY);
18200
18300 IF TOLER>1 THEN DIREC←0;
18400 SETSIG: IF DIREC=0 THEN SIGD←1 ELSE SIGD←DIREC;
18500 XCEN←XIB; YCEN←YIB;
18600
18700
18800 IF TYPE_CORN="L" THEN
18900 BEGIN
19000 XIBB←XTIME(TIME1+6.);
19100 YIBB←YTIME(TIME1+6.);
19200 XIC←XTIME(TIME1);
19300 YIC←YTIME(TIME1);
19400 YID←YTIME(TIME2);
19500 XID←XTIME(TIME2);
19600 IF XIC*XIC+YIC*YIC≥XIBB*XIBB+YIBB*YIBB THEN
19700 BEGIN
19800 X2←XIC; X1←XIBB;
19900 Y2←YIC; Y1←YIBB;
20000 END ELSE
20100 BEGIN
20200 X1←XIC; X2←XIBB;
20300 Y1←YIC; Y2←YIBB;
20400 END;
20500 CX1←Y1-Y2; CY1←X2-X1;
20600 XX1←XCEN+CX1; YY1←YCEN+CY1;
20700 XX2←XCEN-CX1; YY2←YCEN-CY1;
20800 IF(XX1-XID)↑2+(YY1-YID)↑2≥(XX2-XID)↑2+(YY2-YID)↑2 THEN
20900 BEGIN CX←CX1; CY←CY1; END
21000 ELSE BEGIN CX←-CX1; CY←-CY1; END;
21100 CX←CX*SIGD; CY←CY*SIGD;
21200 LINE_MOD(CX,CY,CORNMOD[1,8],CORNMOD[1,COSTHETA],CORNMOD[1,SINTHETA]);
21300 CORNMOD[1,11]←-SIGD;
21400 CORNMOD[1,SINDIR]←CORNMOD[1,11]*CORNMOD[1,SINTHETA];
21500 CORNMOD[1,COSDIR]←-CORNMOD[1,11]*CORNMOD[1,COSTHETA];
21600 GO TO LOOP2;
21700 END;
21800 IF TYPE_CORN="C" THEN
21900 BEGIN
22000 XIC←XTIME(TIME1);
22100 YIC←YTIME(TIME1);
22200 YID←YTIME(TIME2);
22300 XID←XTIME(TIME2);
22400 CX←(YIC-YIB)*SIGD;
22500 CY←(XIB-XIC)*SIGD;
22600 LINE_MOD(CX,CY,CORNMOD[1,8],CORNMOD[1,COSTHETA],CORNMOD[1,SINTHETA]);
22700 CX←(YIB-YID)*SIGD;
22800 CY←(XID-XIB)*SIGD;
22900 LINE_MOD(CX,CY,CORNMOD[2,8],CORNMOD[2,COSTHETA],CORNMOD[2,SINTHETA]);
23000 CORNMOD[1,11]←-SIGD; CORNMOD[2,11]←SIGD;
23100 FOR J←1 STEP 1 UNTIL MODLINES DO
23200 BEGIN
23300 CORNMOD[J,SINDIR]←CORNMOD[J,11]*CORNMOD[J,SINTHETA];
23400 CORNMOD[J,COSDIR]←-CORNMOD[J,11]*CORNMOD[J,COSTHETA];
23500 END;
23600 GO TO LOOP2;
23700 END;
23800 IF TYPE_CORN="P" THEN
23900 BEGIN
24000 XIC←XTIME(TIME1);
24100 YIC←YTIME(TIME1);
24200 YID←YTIME(TIME2);
24300 XID←XTIME(TIME2);
24400 XIE←XTIME(TIME3);
24500 YIE←YTIME(TIME3);
24600 CX←(YIC-YIB)*SIGD;
24700 CY←(XIB-XIC)*SIGD;
24800 LINE_MOD(CX,CY,CORNMOD[1,8],CORNMOD[1,COSTHETA],CORNMOD[1,SINTHETA]);
24900 CX←(YIB-YID)*SIGD;
25000 CY←(XID-XIB)*SIGD;
25100 LINE_MOD(CX,CY,CORNMOD[2,8],CORNMOD[2,COSTHETA],CORNMOD[2,SINTHETA]);
25200 CX←(YIB-YIE)*SIGD;
25300 CY←(XIE-XIB)*SIGD;
25400 LINE_MOD(CX,CY,CORNMOD[3,8],CORNMOD[3,COSTHETA],CORNMOD[3,SINTHETA]);
25500 CORNMOD[1,11]←-SIGD; CORNMOD[2,11]←CORNMOD[3,11]←SIGD;
25600 FOR J←1 STEP 1 UNTIL MODLINES DO
25700 BEGIN
25800 CORNMOD[J,SINDIR]←CORNMOD[J,11]*CORNMOD[J,SINTHETA];
25900 CORNMOD[J,COSDIR]←-CORNMOD[J,11]*CORNMOD[J,COSTHETA];
26000 END;
26100 END;
26200
26300
26400 LOOP2: IF DEB_EYE THEN INCHWL;
26500
26600 X1←XCEN-X_WIDTH/2;
26700 X2←XCEN+X_WIDTH/2;
26800 Y2←YCEN+Y_WIDTH/2;
26900 Y1←YCEN-Y_WIDTH/2;
27000 DPYSET(BUF);
27100 INIT_DOMAIN(X1,Y2,X2,Y1);
27200 BOUNDARY(X1,Y2,X2,Y1);
27300 DISP_MODEL(MODLINES,DIREC,XCEN,YCEN,CORNMOD);
27400 IF EYEFLG=-1 THEN CALCOMP("MODEL",BUF);
27500 INCHWL; INCHWL;
27600 OUTSTR(CRLF&"CENTER OF THE WINDOW "&
27700 CVG(XCEN)&" "& CVG(YCEN) ACRLF);
27800
27900 LOOK_AT[2] ← XCEN;
28000 LOOK_AT[3] ← YCEN;
28100 LOOK_AT[4] ← X_WIDTH;
28200 LOOK_AT[5] ← Y_WIDTH;
28300
28400
28500 TVCAM←LOOK_AT[1];
28600 LSIDE←LOOK_AT[2]-(LOOK_AT[4] DIV 2);
28700 RSIDE←LSIDE+LOOK_AT[4]-1;
28800 FLINE←LOOK_AT[3]-(LOOK_AT[5] DIV 2);
28900 LLINE←FLINE+LOOK_AT[5]-1;
29000 SIZE←X_WIDTH*Y_WIDTH DIV 5;
29100 TCLIP←0; BCLIP←7;
29200 BEGIN
29300 INTEGER ARRAY TVBUF[1:SIZE];
29400
29500 TVWORD←GIOWD(TVBUF);
29600 END;
29700
29800
29900 FOR I←1 STEP 1 UNTIL 10 DO TVIN;
30000
30100 OUTSTR(" ARE YOU SATISFIED WITH THE MODEL?
30200 Y OR N? "ACRLF);
30300 INSTRING←INCHWL;
30400 IF INSTRING="N" THEN GO TO LOOP1;
30500 ⊃ IF ¬DEB_EYE THEN
30600 BEGIN
30700 OUTSTR(" DO YOU WANT DISPLAYS? Y OR N? "ACRLF);
30800 ⊃ IF INCHWL="N" THEN DIS_EYE←0;
30900 ⊃ END;
31000 ⊃ TIME←CALL(0,"RUNTIM");
31100 ⊃ PRINT(TIME);
31200 DPYCLR;
31300 OUTSTR( " DO YOU WANT ALL CORNERS THAT MATCH? Y OR N?"ACRLF);
31400 IF INCHWL="Y" THEN DIR_EYE[0,1]←-1 ELSE DIR_EYE[0,1]←1;
31500 ISSUE(7,"DRV","EYE",
31600 MESSAGE SRCH_IMAGE(MODLINES, DIREC, SEARCH, TOLER, CORNMOD));
31700 COMMENT THIS IS THE CALL ON THE CORNER-FINDER "WALEYE". NOTICE
31800 THAT THE FOUR PARAMETERS AND CORNMOD[...] ARE
31900 PASSED AS ARGUMENTS.;
32000
32100 ⊃ TIME←CALL(0,"RUNTIM");
32200 ⊃ PRINT(TIME);
32300 IF EYEFLG≠0∨¬DIS_EYE THEN GO TO PAR;
32400 INCHWL; INCHWL;
32500 DPYSET(BUF);
32600 INIT_DOMAIN(X1,Y2,X2,Y1);
32700 BOUNDARY(X1,Y2,X2,Y1);
32800 DISP_MODEL(MODLINES,DIREC,XCEN,YCEN,CORNMOD);
32900 INCHWL; INCHWL;
33000
33100
33200 OUTSTR(" DO YOU WANT TO SEE THE COORDINATES OF THE CORNERS?
33300 Y OR N "ACRLF);
33400 IF INCHWL="Y" THEN
33500 BEGIN
33600 SHORT INTEGER NCEN,NCT2,ZOR4,N,K;
33700 NCORNERS←ABS(DIR_EYE[0,1]);
33800 FOR N←1 STEP 1 UNTIL NCORNERS DO
33900 BEGIN "CYC"
34000 NCEN←NCT2←2*(N-1);
34100 IF MODLINES=1 THEN NCT2←N-1;
34200 IF MODLINES=1 THEN
34300 OUTSTR("X-CENTER AT "&CVG(DIR_EYE[N-1,2])&
34400 ", Y-CEMTER AT "&CVG(DIR_EYE[N-1,3])ACRLF)
34500 ELSE OUTSTR("X-VERTEX AT "&CVG(DIR_EYE[NCT2,2])&
34600 ", Y-VERTEX AT "&CVG(DIR_EYE[NCT2,3])ACRLF);
34700 FOR K←1 STEP 1 UNTIL MODLINES DO
34800 BEGIN
34900 IF K=2 THEN
35000 BEGIN
35100 ZOR4←0;
35200 NCT2←NCT2+1;
35300 END
35400 ELSE ZOR4←4;
35500 OUTSTR("TH-VALUE(LINE "&CVS(K)&") = "&CVG(DIR_EYE[NCT2,ZOR4+1])ACRLF);
35600 OUTSTR("C-VALUE(LINE "&CVS(K)&") = "&CVG(DIR_EYE[NCT2,ZOR4+2])ACRLF);
35700 OUTSTR( " SIN(LINE "&CVS(K)&") = "&CVG(DIR_EYE[NCT2,ZOR4+3])ACRLF);
35800 OUTSTR( " COS(LINE "&CVS(K)&") = "&CVG(DIR_EYE[NCT2,ZOR4+4])ACRLF);
35850 END;
35900 END "CYC";
36000 END;
36100
36200
36300
36400 PAR:
36500 OUTSTR("DO YOU WANT TO CHANGE THE THREE WAL PARAMETERS? --- Y OR N"ACRLF);
36600 COMMENT NOTICE THAT THE INPUT STRING IS ONLY COMPARED
36700 WITH "Y". IF IT IS A "Y" (OR STARTS WITH A "Y" --- CHECK
36800 THE SAIL MANUAL FOR THE DETAILS OF STRING COMPARISONS ---
36900 BASICALLY THE "=" COMPARISON ONLY COMPARES THE FIRST
37000 CHARACTERS. THERE IS A BUILT-IN FUNCTION EQUAL(...)
37100 WHICH COMPARES THE COMPLETE STRINGS.), THE JUMP TO LOOP
37200 WILL BE TAKEN. IF THE INPUT STRING IS ANYTHING ELSE
37300 (EVEN JUST A CARRIAGE-RETURN) THE JUMP WILL NOT BE TAKEN.
37400
37500 WARNING: SOMETIMES THE OUTPUT MESSAGES (LIKE THE ONE
37600 PRODUCED BY THE STATEMENT ABOVE) ARE INTERSPERSED WITH
37700 THE HAND/EYE TRACING INFORMATION. IF EVERYTHING COMES
37800 TO A HALT, LOOK THROUGH THE LAST FEW LINES OF THE TRACE
37900 OUTPUT TO SEE IF ONE OF THE PROGRAM-PRODUCED QUESTIONS
38000 OR REMARKS IS EMBEDDED THERE.;
38100
38200 IF INCHWL="Y" THEN GO TO PARMS;
38300 OUTSTR("DO YOU WANT TO CHANGE THE MODEL? --- Y OR N"ACRLF);
38400 IF INCHWL="Y" THEN GO TO LOOP1;
38500 OUTSTR(" DO YOU WANT TO CHANGE THE CAMERA POSITION? --- Y OR N "ACRLF);
38600 IF INCHWL≠"N" THEN GO TO LOOP;
38700
38800
38900 END "CORNFIT";
39000
39100
39200 CORNFIT;
39300
39400
39500
39600 END "WALDRV";